using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._Visibility
{
    /// <summary>
    /// <para>Visibility</para>
    /// <para>Determines the raster surface locations visible to a set of observer features, or identifies which observer points are visible from each raster surface location.</para>
    /// <para>确定对一组观察点要素可见的栅格表面位置，或确定从每个栅格表面位置可见的观察点。</para>
    /// </summary>    
    [DisplayName("Visibility")]
    public class Visibility : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public Visibility()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_raster">
        /// <para>Input raster</para>
        /// <para>The input surface raster.</para>
        /// <para>输入表面栅格。</para>
        /// </param>
        /// <param name="_in_observer_features">
        /// <para>Input point or polyline observer features</para>
        /// <para><xdoc>
        ///   <para>The feature class that identifies the observer locations.</para>
        ///   <para>The input can be point or polyline features.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于标识观察点位置的要素类。</para>
        ///   <para>输入可以是点要素或折线要素。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_out_raster">
        /// <para>Output raster</para>
        /// <para><xdoc>
        ///   <para>The output raster.</para>
        ///   <para>The output will either record the number of times that each cell location in the input surface raster can be seen by the input observation locations (the frequency analysis type), or record which observer locations are visible from each cell in the raster surface (the observers type option).</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出栅格。</para>
        ///   <para>输出将记录输入观测点位置（频率分析类型）可查看输入表面栅格中每个像元位置的次数，或记录栅格表面中每个像元中可见的观察点位置（观察点类型选项）。</para>
        /// </xdoc></para>
        /// </param>
        public Visibility(object _in_raster, object _in_observer_features, object _out_raster)
        {
            this._in_raster = _in_raster;
            this._in_observer_features = _in_observer_features;
            this._out_raster = _out_raster;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Visibility";

        public override string CallName => "3d.Visibility";

        public override List<string> AcceptEnvironments => ["autoCommit", "cellSize", "cellSizeProjectionMethod", "compression", "configKeyword", "extent", "geographicTransformations", "mask", "outputCoordinateSystem", "scratchWorkspace", "snapRaster", "tileSize", "workspace"];

        public override object[] ParameterInfo => [_in_raster, _in_observer_features, _out_raster, _out_agl_raster, _analysis_type.GetGPValue(), _nonvisible_cell_value.GetGPValue(), _z_factor, _curvature_correction.GetGPValue(), _refractivity_coefficient, _surface_offset, _observer_elevation, _observer_offset, _inner_radius, _outer_radius, _horizontal_start_angle, _horizontal_end_angle, _vertical_upper_angle, _vertical_lower_angle];

        /// <summary>
        /// <para>Input raster</para>
        /// <para>The input surface raster.</para>
        /// <para>输入表面栅格。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_raster { get; set; }


        /// <summary>
        /// <para>Input point or polyline observer features</para>
        /// <para><xdoc>
        ///   <para>The feature class that identifies the observer locations.</para>
        ///   <para>The input can be point or polyline features.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于标识观察点位置的要素类。</para>
        ///   <para>输入可以是点要素或折线要素。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input point or polyline observer features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_observer_features { get; set; }


        /// <summary>
        /// <para>Output raster</para>
        /// <para><xdoc>
        ///   <para>The output raster.</para>
        ///   <para>The output will either record the number of times that each cell location in the input surface raster can be seen by the input observation locations (the frequency analysis type), or record which observer locations are visible from each cell in the raster surface (the observers type option).</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出栅格。</para>
        ///   <para>输出将记录输入观测点位置（频率分析类型）可查看输入表面栅格中每个像元位置的次数，或记录栅格表面中每个像元中可见的观察点位置（观察点类型选项）。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_raster { get; set; }


        /// <summary>
        /// <para>Output above ground level raster</para>
        /// <para><xdoc>
        ///   <para>The output above-ground-level (AGL) raster.</para>
        ///   <para>The AGL result is a raster where each cell value is the minimum height that must be added to an otherwise nonvisible cell to make it visible by at least one observer.</para>
        ///   <para>Cells that were already visible will have a value of 0 in this output raster.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出地上 （AGL） 栅格。</para>
        ///   <para>AGL 结果是一个栅格，其中每个像元值都是必须添加到原本不可见的像元的最小高度，才能使其至少被一个观察者看到。</para>
        ///   <para>在此输出栅格中，已可见的像元的值为 0。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output above ground level raster")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_agl_raster { get; set; } = null;


        /// <summary>
        /// <para>Analysis type</para>
        /// <para><xdoc>
        ///   <para>The visibility analysis type.</para>
        ///   <bulletList>
        ///     <bullet_item>Frequency—The output records the number of times that each cell location in the input surface raster can be seen by the input observation locations (as points, or as vertices for polyline observer features). This is the default.</bullet_item><para/>
        ///     <bullet_item>Observers—The output identifies exactly which observer points are visible from each raster surface location.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>可见性分析类型。</para>
        ///   <bulletList>
        ///     <bullet_item>频率 - 输出记录输入观测点位置（作为点或折线观察点要素的折点）可查看输入表面栅格中每个像元位置的次数。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>观察点 - 输出可准确识别从每个栅格表面位置可见的观察点。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Analysis type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _analysis_type_value _analysis_type { get; set; } = _analysis_type_value._FREQUENCY;

        public enum _analysis_type_value
        {
            /// <summary>
            /// <para>Frequency</para>
            /// <para>Frequency—The output records the number of times that each cell location in the input surface raster can be seen by the input observation locations (as points, or as vertices for polyline observer features). This is the default.</para>
            /// <para>频率 - 输出记录输入观测点位置（作为点或折线观察点要素的折点）可查看输入表面栅格中每个像元位置的次数。这是默认设置。</para>
            /// </summary>
            [Description("Frequency")]
            [GPEnumValue("FREQUENCY")]
            _FREQUENCY,

            /// <summary>
            /// <para>Observers</para>
            /// <para>Observers—The output identifies exactly which observer points are visible from each raster surface location.</para>
            /// <para>观察点 - 输出可准确识别从每个栅格表面位置可见的观察点。</para>
            /// </summary>
            [Description("Observers")]
            [GPEnumValue("OBSERVERS")]
            _OBSERVERS,

        }

        /// <summary>
        /// <para>Use NoData for non-visible cells</para>
        /// <para><xdoc>
        ///   <para>Value assigned to nonvisible cells.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—0 is assigned to nonvisible cells. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—NoData is assigned to nonvisible cells.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>分配给不可见单元格的值。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 0 分配给不可见像元。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 将 NoData 指定给不可见像元。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Use NoData for non-visible cells")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _nonvisible_cell_value_value _nonvisible_cell_value { get; set; } = _nonvisible_cell_value_value._false;

        public enum _nonvisible_cell_value_value
        {
            /// <summary>
            /// <para>ZERO</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ZERO")]
            [GPEnumValue("false")]
            _false,

            /// <summary>
            /// <para>NODATA</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NODATA")]
            [GPEnumValue("true")]
            _true,

        }

        /// <summary>
        /// <para>Z factor</para>
        /// <para><xdoc>
        ///   <para>Number of ground x,y units in one surface z unit.</para>
        ///   <para>The z-factor adjusts the units of measure for the z units when they are different from the x,y units of the input surface. The z-values of the input surface are multiplied by the z-factor when calculating the final output surface.</para>
        ///   <para>If the x,y units and z units are in the same units of measure, the z-factor is 1. This is the default.</para>
        ///   <para>If the x,y units and z units are in different units of measure, the z-factor must be set to the appropriate factor, or the results will be incorrect. For example, if your z units are feet and your x,y units are meters, you would use a z-factor of 0.3048 to convert your z units from feet to meters (1 foot = 0.3048 meter).</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>一个表面 z 单元中的地面 x，y 单元数。</para>
        ///   <para>当 z 单位与输入曲面的 x，y 单位不同时，z 因子会调整它们的测量单位。在计算最终输出曲面时，输入曲面的 z 值乘以 z 因子。</para>
        ///   <para>如果 x，y 单位和 z 单位采用相同的测量单位，则 z 因子为 1。这是默认设置。</para>
        ///   <para>如果 x，y 单位和 z 单位采用不同的测量单位，则必须将 z 因子设置为适当的因子，否则结果将不正确。例如，如果 z 单位是英尺，x，y 单位是米，则使用 z 因子 0.3048 将 z 单位从英尺转换为米（1 英尺 = 0.3048 米）。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z factor")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _z_factor { get; set; } = 1;


        /// <summary>
        /// <para>Use earth curvature corrections</para>
        /// <para><xdoc>
        ///   <para>Specifies whether correction for the earth's curvature will be applied.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—No curvature correction will be applied. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—Curvature correction will be applied.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否应用地球曲率校正。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 不应用曲率校正。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 将应用曲率校正。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Use earth curvature corrections")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _curvature_correction_value _curvature_correction { get; set; } = _curvature_correction_value._false;

        public enum _curvature_correction_value
        {
            /// <summary>
            /// <para>FLAT_EARTH</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("FLAT_EARTH")]
            [GPEnumValue("false")]
            _false,

            /// <summary>
            /// <para>CURVED_EARTH</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("CURVED_EARTH")]
            [GPEnumValue("true")]
            _true,

        }

        /// <summary>
        /// <para>Refractivity coefficient</para>
        /// <para><xdoc>
        ///   <para>The coefficient of the refraction of visible light in air.</para>
        ///   <para>The default value is 0.13.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>空气中可见光的折射系数。</para>
        ///   <para>默认值为 0.13。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Refractivity coefficient")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _refractivity_coefficient { get; set; } = 0.13;


        /// <summary>
        /// <para>Surface offset</para>
        /// <para><xdoc>
        ///   <para>A vertical distance to be added to the z-value of each cell as it is considered for visibility. It must be a positive integer or floating-point value.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>By default, a numerical field OFFSETB is used if it exists in the input observer features attribute table. You may overwrite it by specifying another numerical field or a value.</para>
        ///   <para>If this parameter is unspecified and the default field does not exist in the input observer features attribute table, it defaults to 0.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要添加到每个单元格的 z 值的垂直距离，因为它被考虑为可见性。它必须是正整数或浮点值。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>默认情况下，如果输入观察点要素属性表中存在数值字段 OFFSETB，则使用该字段。您可以通过指定另一个数值字段或值来覆盖它。</para>
        ///   <para>如果未指定此参数，且输入观察点要素属性表中不存在默认字段，则默认为 0。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Surface offset")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _surface_offset { get; set; } = null;


        /// <summary>
        /// <para>Observer elevation</para>
        /// <para><xdoc>
        ///   <para>The surface elevations of the observer points or vertices.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>By default, a numerical field SPOT is used if it exists in the input observer features attribute table. You may overwrite it by specifying another numerical field or a value.</para>
        ///   <para>If this parameter is unspecified and the default field does not exist in the input observer features attribute table, it will be estimated through bilinear interpolation with the surface elevation values in the neighboring cells of the observer location.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>观察点或顶点的表面高程。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>默认情况下，如果输入观察点要素属性表中存在数值字段 SPOT，则使用该字段。您可以通过指定另一个数值字段或值来覆盖它。</para>
        ///   <para>如果未指定此参数，并且输入观察点要素属性表中不存在默认字段，则将通过使用观察点位置相邻像元中的表面高程值进行双线性插值进行估计。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Observer elevation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _observer_elevation { get; set; } = null;


        /// <summary>
        /// <para>Observer offset</para>
        /// <para><xdoc>
        ///   <para>A vertical distance to be added to the observer elevation. It must be a positive integer or floating-point value.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>By default, a numerical field OFFSETA is used if it exists in the input observer features attribute table. You may overwrite it by specifying another numerical field or a value.</para>
        ///   <para>If this parameter is unspecified and the default field does not exist in the input observer features attribute table, it defaults to 1.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要添加到观察点高程的垂直距离。它必须是正整数或浮点值。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>默认情况下，如果输入观察点要素属性表中存在数值字段 OFFSETA，则使用该字段。您可以通过指定另一个数值字段或值来覆盖它。</para>
        ///   <para>如果未指定此参数，且输入观察点要素属性表中不存在默认字段，则默认为 1。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Observer offset")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _observer_offset { get; set; } = null;


        /// <summary>
        /// <para>Inner radius</para>
        /// <para><xdoc>
        ///   <para>The start distance from which visibility is determined. Cells closer than this distance are not visible in the output but can still block visibility of the cells between inner radius and outer radius.</para>
        ///   <para>It can be a positive or negative integer or floating point value. If it is a positive value, then it is interpreted as three-dimensional, line-of-sight distance. If it is a negative value, then it is interpreted as two-dimensional planimetric distance.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>By default, a numerical field RADIUS1 is used if it exists in the input observer features attribute table. You may overwrite it by specifying another numerical field or a value.</para>
        ///   <para>If this parameter is unspecified and the default field does not exist in the input observer features attribute table, it defaults to 0.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>确定可见性的起始距离。小于此距离的像元在输出中不可见，但仍会阻止内半径和外半径之间的像元可见。</para>
        ///   <para>它可以是正整数或负整数或浮点值。如果它是正值，则将其解释为三维视线距离。如果它是负值，则将其解释为二维平面距离。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>默认情况下，如果输入观察点要素属性表中存在数值字段，则使用该字段RADIUS1。您可以通过指定另一个数值字段或值来覆盖它。</para>
        ///   <para>如果未指定此参数，且输入观察点要素属性表中不存在默认字段，则默认为 0。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Inner radius")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _inner_radius { get; set; } = null;


        /// <summary>
        /// <para>Outer radius</para>
        /// <para><xdoc>
        ///   <para>The maximum distance from which visibility is determined. Cells beyond this distance are excluded from the analysis.</para>
        ///   <para>It can be a positive or negative integer or floating point value. If it is a positive value, then it is interpreted as three-dimensional, line-of-sight distance. If it is a negative value, then it is interpreted as two-dimensional planimetric distance.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>By default, a numerical field RADIUS2 is used if it exists in the input observer features attribute table. You may overwrite it by specifying another numerical field or a value.</para>
        ///   <para>If this parameter is unspecified and the default field does not exist in the input observer features attribute table, it defaults to infinity.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>确定可见性的最大距离。超出此距离的细胞将被排除在分析之外。</para>
        ///   <para>它可以是正整数或负整数或浮点值。如果它是正值，则将其解释为三维视线距离。如果它是负值，则将其解释为二维平面距离。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>默认情况下，如果输入观察点要素属性表中存在数值字段，则使用该字段RADIUS2。您可以通过指定另一个数值字段或值来覆盖它。</para>
        ///   <para>如果未指定此参数，且输入观察点要素属性表中不存在默认字段，则默认为无穷大。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Outer radius")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _outer_radius { get; set; } = null;


        /// <summary>
        /// <para>Horizontal start angle</para>
        /// <para><xdoc>
        ///   <para>The start angle of the horizontal scan range. The value should be specified in degrees from 0 to 360, either as integer or floating point, with 0 oriented to north. The default value is 0.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>By default, a numerical field AZIMUTH1 is used if it exists in the input observer features attribute table. You may overwrite it by specifying another numerical field or a value.</para>
        ///   <para>If this parameter is unspecified and the default field does not exist in the input observer features attribute table, it defaults to 0.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>水平扫描范围的起始角度。该值应以 0 到 360 的度数为单位指定，可以是整数或浮点数，其中 0 朝北。默认值为 0。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>默认情况下，如果输入观察点要素属性表中存在数值字段，则使用该字段AZIMUTH1。您可以通过指定另一个数值字段或值来覆盖它。</para>
        ///   <para>如果未指定此参数，且输入观察点要素属性表中不存在默认字段，则默认为 0。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Horizontal start angle")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _horizontal_start_angle { get; set; } = null;


        /// <summary>
        /// <para>Horizontal end angle</para>
        /// <para><xdoc>
        ///   <para>The end angle of the horizontal scan range. The value should be specified in degrees from 0 to 360, either as integer or floating point, with 0 oriented to north. The default value is 360.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>By default, a numerical field AZIMUTH2 is used if it exists in the input observer features attribute table. You may overwrite it by specifying another numerical field or a value.</para>
        ///   <para>If this parameter is unspecified and the default field does not exist in the input observer features attribute table, it defaults to 360.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>水平扫描范围的结束角。该值应以 0 到 360 的度数为单位指定，可以是整数或浮点数，其中 0 朝北。默认值为 360。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>默认情况下，如果输入观察点要素属性表中存在数值字段，则使用该字段AZIMUTH2。您可以通过指定另一个数值字段或值来覆盖它。</para>
        ///   <para>如果未指定此参数，且输入观察点要素属性表中不存在默认字段，则默认为 360。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Horizontal end angle")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _horizontal_end_angle { get; set; } = null;


        /// <summary>
        /// <para>Vertical upper angle</para>
        /// <para><xdoc>
        ///   <para>The upper vertical angle limit of the scan relative to the horizontal plane. The value is specified in degrees and can be integer or floating point. The allowed range is from above -90 up to and including 90.</para>
        ///   <para>This parameter value must be greater than the Vertical Lower Angle parameter value.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>By default, a numerical field VERT1 is used if it exists in the input observer features attribute table. You may overwrite it by specifying another numerical field or a value.</para>
        ///   <para>If this parameter is unspecified and the default field does not exist in the input observer features attribute table, it defaults to 90.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>扫描相对于水平面的垂直角度上限。该值以度为单位指定，可以是整数或浮点数。允许的范围是从 -90 以上到 90（包括 90）。</para>
        ///   <para>此参数值必须大于“垂直下角”参数值。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>默认情况下，如果输入观察点要素属性表中存在数值字段 VERT1，则使用该字段。您可以通过指定另一个数值字段或值来覆盖它。</para>
        ///   <para>如果未指定此参数，且输入观察点要素属性表中不存在默认字段，则默认为 90。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Vertical upper angle")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _vertical_upper_angle { get; set; } = null;


        /// <summary>
        /// <para>Vertical lower angle</para>
        /// <para><xdoc>
        ///   <para>The lower vertical angle limit of the scan relative to the horizontal plane. The value is specified in degrees and can be integer or floating point. The allowed range is from -90 up to but not including 90.</para>
        ///   <para>This parameter value must be less than the Vertical Upper Angle parameter value.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>By default, a numerical field VERT2 is used if it exists in the input observer features attribute table. You may overwrite it by specifying another numerical field or a value.</para>
        ///   <para>If this parameter is unspecified and the default field does not exist in the input observer features attribute table, it defaults to -90.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>扫描相对于水平面的垂直角度下限。该值以度为单位指定，可以是整数或浮点数。允许的范围是从 -90 到但不包括 90。</para>
        ///   <para>此参数值必须小于“垂直上角”参数值。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>默认情况下，如果输入观察点要素属性表中存在数值字段 VERT2，则使用该字段。您可以通过指定另一个数值字段或值来覆盖它。</para>
        ///   <para>如果未指定此参数，且输入观察点要素属性表中不存在默认字段，则默认为 -90。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Vertical lower angle")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _vertical_lower_angle { get; set; } = null;


        public Visibility SetEnv(int? autoCommit = null, object cellSize = null, object compression = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object mask = null, object outputCoordinateSystem = null, object scratchWorkspace = null, object snapRaster = null, double[] tileSize = null, object workspace = null)
        {
            base.SetEnv(autoCommit: autoCommit, cellSize: cellSize, compression: compression, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, mask: mask, outputCoordinateSystem: outputCoordinateSystem, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, tileSize: tileSize, workspace: workspace);
            return this;
        }

    }

}